package game.model;

import java.awt.Color;
import java.util.Set;

/**
 * Clase abstracta de la cual heredan las diferentes componentes, implementa
 * metodos comunes a todas y enuncia metodos abstractos que deberan ser
 * implementados en cada clase en particular.
 * 
 */

public abstract class Componente {
	protected int imagenID;
	
	/**
	 * Setea el ID de la imagen de la componente. Este valor de ID se relaciona
	 * mediante metodos de front end con el archivo de imagen.
	 * 
	 * @param imagenID entero con el ID de la imagen.
	 */
	
	public void setImagen(int imagenID) {
		this.imagenID = imagenID;
	}

	/**
	 * Retorna el ID de la imagen de la componente.
	 * 
	 * @return int entero con el ID de la imagen.
	 */
	
	public int getImagen() {
		return imagenID;
	}
	
	/**
	 * Retorna un string con los datos de la componente en el formato adecuado
	 * para poder ser escrito directamente en el archivo que guarda una partida.
	 * 
	 * @param ubicacion el valor de coordenadas en el tablero de la celda que contiene
	 * a la componente.
	 */
	
	public abstract String salvarEstado(String ubicacion);
	
	/**
	 * Devuelve en funcion de un rayo incidente las salidas que tendra el mismo
	 * en la celda.
	 * 
	 * @param entrada rayo que entra en la celda.
	 * @return Set<Rayo> set que contiene todas las salidas de rayos de la celda.
	 */
	
	public abstract Set<Rayo> getSalida(Rayo entrada);
	
	/**
	 * Devuelve en funcion de todos los rayos incidentes las salidass que tendran
	 * los mismos en la celda.
	 * 
	 * @param entrada rayo que entra en la celda.
	 * @param anterior rayos de entrada o salida calculados antes.
	 * @return Set<Rayo> set que contiene todas las salidas de rayos de la celda.
	 */
	
	public abstract Set<Rayo> getSalida(Rayo entrada, Set<Rayo> anterior);
	
	/**
	 * Retorna el color del componente, por default es el azul. En caso de ser necesario
	 * cada Componente debera hacer un override del metodo. 
	 * 
	 * @return Color color de la componente.
	 */
	
	public Color getColor() {
		return new Color(0, 0, 255);
	}
}
